package com.example.myweb.Repository.JpaRepository;

import com.example.myweb.Domain.Entity.Follow;
import com.example.myweb.Domain.Entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface FollowRepository extends JpaRepository<Follow, Long> {

    // 根据关注者和被关注者查找关注记录
    Optional<Follow> findByFollowerAndFollowed(User follower, User followed);

    // 根据关注者和被关注者的ID删除记录，返回删除的行数，用于DELETE请求
    long deleteByFollowerAndFollowed_UserId(User follower, Long followedUserId);

    @Query("SELECT f.followed.userId FROM Follow f WHERE f.follower = :follower")
    List<Long> findFollowedUserIdsByFollower(@Param("follower") User follower);

    /**
     * 分页查询指定用户关注的人列表
     * @param follower 关注者
     * @param pageable 分页信息
     * @return 分页后的关注记录
     */
    Page<Follow> findByFollower(User follower, Pageable pageable);

    /**
     * 分页查询指定用户的粉丝列表
     * @param followed 被关注者
     * @param pageable 分页信息
     * @return 分页后的关注记录
     */
    Page<Follow> findByFollowed(User followed, Pageable pageable);

    /**
     * 一次性查询当前用户是否关注了目标用户列表中的人
     * @param currentUser 当前用户
     * @param targetUserIds 目标用户ID列表
     * @return 当前用户已关注的目标用户ID集合
     */
    @Query("SELECT f.followed.userId FROM Follow f WHERE f.follower = :currentUser AND f.followed.userId IN :targetUserIds")
    Set<Long> findFollowedIdsByCurrentUser(@Param("currentUser") User currentUser, @Param("targetUserIds") List<Long> targetUserIds);

}